package com.sxj.corejava.code11_IO.字节流;

import java.io.*;

/**
 * @author 石小俊
 * 2024年07月29日 10:10
 */
public class Test01_文件字节输入流 {

    public static void main(String[] args) {
        test03();
    }

    public static void test01() {
        File file = new File("corejava/src/hello.txt");
        System.out.println(file.exists());
        FileInputStream in = null;
        try {
            in = new FileInputStream(file);
            // in.read():从输入流中读取一个字节数据
            // 如果没有读取到数据,则返回-1
            //System.out.println(in.read());
            // 可以通过循环,自动读取所有数据
            int data = -1;
            while ((data = in.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 在IO操作中,所有流最终需要释放
            // 谁开的流谁关
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void test02() {
        File file = new File("corejava/src/hello.txt");
        System.out.println(file.exists());
        try (
                // 将所有需要释放的资源在此处进行声明
                // 在操作完成之后会自动释放资源
                // 只有实现类AutoCloseable的类才能在此处声明
                FileInputStream in = new FileInputStream(file);
        ) {
            // 由于中文根据字符集不同占的字节数也不同
            // 因此,每次读取一个字节时,中文无法展示
            // 可以考虑一次性读取多个字节
            byte[] b = new byte[1024];
            // 此时的返回值是读取到的字节数据总数
            //int i = in.read(b);
            //System.out.println(i);
            //// 读取到的数据存储到了对应的数组中
            //System.out.println(Arrays.toString(b));
            //// 我们需要从数据中取出前in.read(b)个字节转换成对应的字符
            //System.out.println(new String(b,0,i));
            int i = -1;
            while ((i = in.read(b)) != -1) {
                System.out.print(new String(b, 0, i));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void test03() {
        try (
                InputStream in = Test01_文件字节输入流.class.getClassLoader().getResourceAsStream("hello.txt");
        ) {
            byte[] b = new byte[1024];
            int i = -1;
            while ((i = in.read(b)) != -1) {
                System.out.print(new String(b, 0, i));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
